我的简书:https://www.jianshu.com/u/c91e642c4d90
我的CSDN:http://blog.csdn.net/wo_ha
我的GitHub:https://github.com/chuanqiLjp
我的个人博客:https://chuanqiljp.github.io/
版权声明:商业转载请联系我获得授权,非商业转载请在醒目位置注明出处。
1.eclipse中的Jni开发流程(一)
2.eclipse中的Jni开发流程(二)
3.Android Studio配置CMake开发NDK
1.在SDK Tools中勾选安装CMake、LLDB、NDK
2.配置一些快捷方式
###参数讲解1
2
3
4
5
6
7
8
9javah 用于生成头文件
Program:$JDKPath$/bin/javah
Parameters:-d ../jni -jni $FileClass$
Working directory:$SourcepathEntry$\..\java
ndk-build 用于构建so包
注意:MAC/Linux用ndk-build,没有.cmd后缀
Program:D:\adt\sdk\ndk-bundle\ndk-build.cmd
Parameters:什么都不用填
Working directory:$ModuleFileDir$\src\main
3.在工程的local.properties文件中配置NDK的目录
1 | sdk.dir=C\:\\Users\\yuxue\\AppData\\Local\\Android\\sdk |
也可以使用图形界面,单击模块选择Open Moude Setting,选择好NDK的路径
4.编译时如果检查NDK过时了可以在gradle.properties文件中增加“android.useDeprecatedNdk=true”使它可以使用过时的NDK
1 | android.useDeprecatedNdk=true |
5.创建CMakeLists.txt文件并放在模块的的根目录
1 | # 设置构建本地库所需的最小版本的cbuild。 |
6.在模块的build.gradle文件中添加
1 | android { |
7.编写Java中的Native方法
1 | public native String getStr(); |
8.生成C的头文件
生成后
9.编写C函数
1 | #include "stdio.h" |
至此,这个项目就可以运行了
更多的学习
1
2
3(1) .externalNativeBuild文件夹:用于存放cmake编译好的文件,包括支持的各种硬件等信息,有点类似于build.gradle文件明确Gradle如何编译APP;
(2) cpp文件夹:存放C/C++代码文件,native-lib.cpp文件默认生成的;
(3) CMakeLists.txt:cmake脚本配置文件,cmake会根据该脚本文件中的指令去编译相关的C/C++源文件,并将编译后产物生成共享库或静态块,然后Gradle将其打包到APK中。
CMakeLists.txt文件解析如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 指定cmke版本
cmake_minimum_required(VERSION3.4.1)
# add_library()命令用于向CMake添加依赖源文件或库
# 指令需传入三个参数(函数库名称、库类型、依赖源文件相对路径)
add_library( # 生成函数库的名称,即libnative-lib.so或libnative-lib.a(lib和.so/.a默认缺省)
native-lib
# 生成库类型:动态库为SHARED,静态库为STATIC
SHARED
# 依赖的c/cpp文件(相对路径)
src/main/cpp/native-lib.cpp )
# find_library()命令用于定位NDK中的库
# 需传入两个参数(path变量、ndk库名称)
find_library( # 设置path变量的名称,这里为NDK中的日志库
log-lib
#指定cmake查询库的名称
#即在ndk开发包中查询liblog.so函数库,将其路径赋值给log-lib
log )
#target_link_libraries()命令用于指定要关联到的原生库的库
target_link_libraries(# 指定目标库,与上面指定的函数库名一致
native-lib
# 链接的库,根据log-lib变量对应liblog.so函数库
${log-lib} )
通过查看native-lib.cpp方法,stringFromJNI目的是向Java层返回一个字符串。如果要在native-lib.cpp文件中添加新的方法,必须添加在extern”C” { } 中,或者在每个方法前加extern”C”, 否则会报找不到方法。如果源文件为C,则须将extern“C”部分去掉,因为extern “C”的作用就是告诉编译器以C方式编译。
JNI开发打印日志
1 | #include <android/log.h> |
Android系统目前支持的CPU架构
1 | ARMv5,ARMv7 (从2010年起) |
我的CSDN博客地址:http://blog.csdn.net/wo_ha/article/details/78131635